/**
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2009，所有权利保留。
 * 
 * 项目名：	rumba-web
 * 文件名：	RAction.java
 * 模块说明：	
 * 修改历史：
 * Jan 8, 2009 - lxm - 创建。
 */
package com.hd123.rumba.gwt.widget2.client.action;

import java.util.ArrayList;
import java.util.List;

import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.ClickListener;
import com.hd123.rumba.gwt.widget2.client.misc.RImageLocation;

/**
 * 普通动作定义控件。
 * 
 * @author lxm
 * 
 */
@SuppressWarnings("deprecation")
public class RAction extends RActionBase {

  /**
   * 创建对象实例。
   */
  public RAction() {
    super();
  }

  /**
   * 创建对象实例。
   * 
   * @param caption
   *            指定标题。
   */
  public RAction(String caption) {
    this();
    this.setCaption(caption);
  }

  /**
   * 创建对象实例。
   * 
   * @param caption
   *            指定标题。
   * @param icon
   *            指定图标。
   */
  public RAction(String caption, RImageLocation icon) {
    this(caption);
    this.setIcon(icon);
  }

  /**
   * @deprecated 被{@link #RAction(String, ClickHandler)}替代。
   */
  public RAction(String caption, ClickListener listener) {
    this(caption);
    this.addListener(listener);
  }

  /**
   * 创建对象实例。
   * 
   * @param caption
   *            指定标题
   * @param handler
   *            指定Click事件句柄。
   */
  public RAction(String caption, ClickHandler handler) {
    this(caption);
    addClickHandler(handler);
  }

  /**
   * @deprecated 被{@link #RAction(String, RImageLocation, ClickHandler)}替代。
   */
  public RAction(String caption, RImageLocation icon, ClickListener listener) {
    this(caption);
    this.setIcon(icon);
    this.addListener(listener);
  }

  /**
   * 创建对象实例。
   * 
   * @param caption
   *            指定标题。
   * @param icon
   *            指定图标。
   * @param handler
   *            指定Click事件句柄。
   */
  public RAction(String caption, RImageLocation icon, ClickHandler handler) {
    this(caption);
    setIcon(icon);
    addClickHandler(handler);
  }

  private RImageLocation hoveringIcon;
  /** List of IsActionControl */
  private List controls = new ArrayList();

  /** 当光标位于部件之上时的图标。null表示等于icon。 */
  public RImageLocation getHoveringIcon() {
    return hoveringIcon;
  }

  public void setHoveringIcon(RImageLocation hoveringIcon) {
    this.hoveringIcon = hoveringIcon;
    applyToControls();
  }

  /**
   * 清除所有已关联的动作界面控件对象。
   */
  public void clearControls() {
    controls.clear();
  }

  /**
   * 添加一个关联的界面控件对象。
   * 
   * @param control
   *            not null。
   */
  public void addControl(IsRActionControl control) {
    if (control == null)
      throw new RuntimeException("指定的参数control不允许为null。");
    if (controls.contains(control))
      return;
    controls.add(control); // 必须在setAction之前被调用。
    control.setAction(this);
    control.applyAction();
  }

  /**
   * 删除指定关联的界面控件对象。
   * 
   * @param control
   *            not null。
   */
  public void removeControl(IsRActionControl control) {
    if (control == null)
      throw new RuntimeException("指定的参数control不允许为null。");
    if (!controls.contains(control))
      return;
    controls.remove(control);
    control.setAction(null);
    control.applyAction();
  }

  /**
   * 判断是否已经包含了指定的界面控件对象。
   * 
   * @param control
   * @return
   */
  public boolean containsControl(IsRActionControl control) {
    return controls.contains(control);
  }

  protected void applyToControls() {
    for (int i = 0, n = controls.size(); i < n; i++) {
      IsRActionControl control = (IsRActionControl) controls.get(i);
      control.applyAction();
    }
  }

}
